import { Notification } from 'element-ui'
import axios from 'axios'
import Qs from 'qs'
// url 配置
const requestMap = {
  // sprint boot
  boot: process.env.VUE_APP_BASE_API,
  // 平台地址
  platform: process.env.VUE_APP_PLATFORM_API
}
axios.defaults.withCredentials = true
axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'

// 创建实例
const instance = axios.create({
  // 表示跨域请求时是否需要使用凭证
  withCredentials: true,
  // 指定请求超时的毫秒数(0 表示无超时时间)
  timeout: 0,
  // 是即将被发送的自定义请求头
  headers: {
    // 'token': window.token || 'eyJhbGciOiJIUzI1NiIsIlR5cGUiOiJKV1QiLCJ0eXAiOiJKV1QifQ.eyJuYW1lIjoiYXBwYWRtaW4iLCJyb2xlTmFtZSI6IuW5s-WPsOeuoeeQhuWRmCIsImlkIjoiNDAyODg2MTc0YjE1Y2Y2YTAxNGIxNWQxOTQ1MTAwMDQifQ.jMKnO5s4tLE5qO0wvT2CCIF-zO4jVsh6C8P2ffXvmdg',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    // 'Origin': document.location.origin
  },
  // 将自动加在 `url` 前面，除非 `url` 是一个绝对 URL
  baseURL: requestMap.boot,
  // 允许在向服务器发送前，修改请求数据
  transformRequest: [
    params => {
      // console.log('paramsSerializer', params)
      return Qs.stringify(params, { arrayFormat: 'indices' })
    }
  ],
  // `paramsSerializer` 是一个负责 `params` 序列化的函数
  paramsSerializer: (params) => {
    return Qs.stringify(params, { arrayFormat: 'indices' })
  },
  crossDomain: true
  // ,
  // // `transformResponse` 在传递给 then/catch 前，允许修改响应数据
  // transformResponse: (response) => {
  //   //
  //   const res = response.data
  //   if (String(res.code) !== '200') {
  //     Notification.error({
  //       title: '失败',
  //       message: res.msg || 'Error'
  //     })
  //   } else {
  //     return res
  //   }
  // }
})

// 返回状态判断
instance.interceptors.response.use((response) => {
  //
  //
  const res = response.data
  if (String(res.code) !== '200' || response.status == 500) {
    Notification.error({
      title: '失败',
      message: res.msg || 'Error'
    })
  } else {
    return res
  }
}, (err) => {
  return Promise.reject(err)
})

// console.log('instance',instance.defaults)

export class axiosMethods {
  /**
   * get请求方法
   * @param url
   * @param params
   * @returns {Promise<unknown>}
   */
  static get(url, params) {
    // app/开头的url是平台的请求
    instance.defaults.baseURL = /jointos/.test(url) ? requestMap.platform : requestMap.boot
    return new Promise((resolve, reject) => {
      instance.get(url, {
        params: Object.assign({}, (params || {}))
      }).then(response => {
        resolve(response.data)
      }, err => {
        this.$message({
          message: err.error.message,
          type: 'error',
          duration: 5 * 1000
        })
        reject(err)
      }).catch((error) => {
        reject(error)
      })
    })
  }

  /**
   * post 请求方法
   * @param url
   * @param params
   * @returns {Promise<unknown>}
   */
  static post(url, params) {
    // app/开头的url是平台的请求
    instance.defaults.baseURL = /jointos/.test(url) ? requestMap.platform : requestMap.boot
    return new Promise((resolve, reject) => {
      instance.post(url, params).then(response => {
        resolve(response.data)
      }, err => {
        this.$message({
          message: err.error.details,
          type: 'error',
          duration: 5 * 1000
        })
        reject(err)
      }).catch((error) => {
        reject(error)
      })
    })
  }
  /**
   * post 请求方法
   * @param url
   * @param params
   * @returns {Promise<unknown>}
   */
  static put(url, params) {
    // app/开头的url是平台的请求
    instance.defaults.baseURL = /jointos/.test(url) ? requestMap.platform : requestMap.boot
    return new Promise((resolve, reject) => {
      instance.request({
        url,
        method: 'put',
        data: params
      }).then(response => {
        resolve(response.data)
      }, err => {
        this.$message({
          message: err.error.details,
          type: 'error',
          duration: 5 * 1000
        })
        reject(err)
      }).catch((error) => {
        reject(error)
      })
      // instance.put(url, params,{
      //   'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
      // }).then(response => {
      //   resolve(response.data)
      // }, err => {
      //   this.$message({
      //     message: err.error.details,
      //     type: 'error',
      //     duration: 5 * 1000
      //   })
      //   reject(err)
      // }).catch((error) => {
      //   reject(error)
      // })
    })
  }
  /**
   * post 请求方法
   * @param url
   * @param params
   * @returns {Promise<unknown>}
   */
  static postJson(url, params) {
    // app/开头的url是平台的请求
    instance.defaults.baseURL = /jointos/.test(url) ? requestMap.platform : requestMap.boot
    return new Promise((resolve, reject) => {
      instance.post(url, JSON.stringify(params),
        // {
        //   withCredentials: true,
        //   headers: {
        //     'Content-Type': 'application/json'
        //   }
        // }
      ).then(response => {
        resolve(response.data)
      }, err => {
        this.$message({
          message: err.error.details,
          type: 'error',
          duration: 5 * 1000
        })
        reject(err)
      }).catch((error) => {
        reject(error)
      })
    })
  }

  /**
   * get请求方法
   * @param url
   * @param params
   * @returns {Promise<unknown>}
   */
  static delete(url, params) {
    // app/开头的url是平台的请求
    instance.defaults.baseURL = /jointos/.test(url) ? requestMap.platform : requestMap.boot
    return new Promise((resolve, reject) => {
      instance.delete(url, {
        params: Object.assign({}, (params || {}))
      }).then(response => {
        resolve(response.data)
      }, err => {
        this.$message({
          message: err.error.message,
          type: 'error',
          duration: 5 * 1000
        })
        reject(err)
      }).catch((error) => {
        reject(error)
      })
    })
  }

  static request(config) {
    return new Promise((resolve, reject) => {
      instance.request(config).then(response => {
        resolve(response.data)
      }, err => {
        this.$message({
          message: err.error.message,
          type: 'error',
          duration: 5 * 1000
        })
        reject(err)
      }).catch((error) => {
        reject(error)
      })
    })
  }
}

